package com.kiven.file;

import java.io.*;
import java.util.zip.*;

public class Zip {
	private static int BUFFER = 2048;
	/**
	 * 压缩文件夹<br>
	 * Example<br>
	 * 
	 * fileName = "/home/lijianbo/kivenTest"
	 * fileName = "/home/lijianbo/test/kivenTest.zip"
	 * 
	 * @param fileName 要压缩的文件(文件路径)
	 * @param zipFilePath 压缩后文件存放的路径
	 */
	
	
	public void zip(String fileName,String zipFilePath) throws Exception {
		File fileDir = new File(fileName);
		System.out.println(fileDir.getName());
		File zipFile = new File(zipFilePath);
		OutputStream os = new FileOutputStream(zipFile);
		ZipOutputStream zos = new ZipOutputStream(os);
		
		doZip(fileDir,zos,"");
		zos.close();
	}
	
	//这个方法是压缩文件的处理部分，把它定为private的原因是，这里用到的一些参数是由zip构造方法中获得的，为了避免出错而将该方法变为私有的
	private void doZip(File file,ZipOutputStream zos,String dir) throws Exception{
		if(file.isDirectory()) {
			File[] files = file.listFiles();
			//判断根的层次
			dir = dir + (dir.length() == 0 ? "":File.separator) + file.getName();
			
			//循环压缩该目录下的所有文件
			for(File f : files) {
				doZip(f,zos,dir);
			}
		}
		//不是文件夹的话，就对里面文件进行压缩
		else {
			byte[] buf = new byte[BUFFER];
			FileInputStream fis = new FileInputStream(file);
			BufferedInputStream bi = new BufferedInputStream(fis);
			dir = dir.length() == 0 ? "":(dir + File.separator + file.getName());
			ZipEntry entry = new ZipEntry(dir);
			zos.putNextEntry(entry);
			
			int count;
			
			while((count = bi.read(buf)) != -1) {
				zos.write(buf, 0, count);
			}
			
			bi.close();
			fis.close();
		}
	}
	
	/*
	public static void main(String[] args) throws Exception{
		new Test().zip("/home/lijianbo/kivenTest", "/home/lijianbo/test/kivenTest.zip");
		System.out.println("Zip file success...");
	}
	*/
}

